package com.mall.mymall.common;

import com.mall.mymall.dao.entity.Products;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface ProductRepository extends ElasticsearchRepository<Products, String> {

    /**
     * spring-boot-data-elasticsearch也支持按方法名派生查询
     *
     * @param productName 查询内容
     * @return 返回值
     */
    List<Products> findByProductName(String productName);

//    @Query("{\"match\": {\"product_name\": {\"query\": \"?0\"}}}")
//    List<Products> searchByProductName(String productName);

//    int countByProductName(String productName);


    /**
     * 由于索引中已经配置了中文分词器
     * 所以可以直接使用multi_match 和multi子句进行条件匹配
     * 否则使用 \"wildcard\":{ \"字段名\": \"*?0*\"} 进行条件匹配
     * multi_match 表示多个字段的查询 允许指定field
     * multi 表示单个字段的查询
     *
     * @param text 查询内容
     * @return 返回值
     */
    @Query("{\"multi_match\":{\"query\":\"?0\",\"fields\":[\"product_name\",\"description\"]}}")
    List<Products> searchText(String text);

    /**
     * @param text 查询内容
     * @return 返回值
     */
    // 方式2：带权重的智能搜索
    @Query("{\"multi_match\": {\"query\": \"?0\", \"fields\": [\"product_name^3\", \"description\"], \"type\": \"best_fields\"}}")
    List<Products> smartSearchProducts(String text);

    /**
     * bool复合查询 允许匹配个条件，可以在下面的各种子句中嵌套bool达成复杂查询
     * must 表示条件与 && and
     * should 表示条件或 ||，or之类的近义词
     * must_not 表示条件非
     * filter 过滤器 一般搭配聚合查询使用 比如范围查询 存在查询
     *
     * @param text 查询内容
     * @return 返回值
     */
    // 方式3：模糊搜索（包含部分匹配）
    @Query("{\"bool\": {\"should\": [" +
            "{\"match\": {\"product_name\": \"?0\"}}, " +
            "{\"match\": {\"description\": \"?0\"}}" +
            "]}}")
    List<Products> fuzzySearch(String text);

}
